package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignClient;

/**
 * 1.整合MyBatis-Plus
 *  1)、导入依赖
 *   <dependency>
 *             <groupId>com.baomidou</groupId>
 *             <artifactId>mybatis-plus-boot-starter</artifactId>
 *             <version>3.2.0</version>
 *   </dependency>
 *   2)、配置
 *    ①配置数据源
 *      a.导入数据库驱动-由于后续所有微服务都要操作数据库，所以将数据库驱动写入common模块
 *      b.配置数据源 推荐yml文件
 *    ②配置Mybatis-plus
 *      a.启动类上使用@MapperScan扫描mapper接口
 *      b.告诉MyBatis-Plus sql映射文件位置 在yml文件中配置mapper-locations位置
 *      c.id-type auto配置主键自增
 *
*  2、逻辑删除
 *   1)配置全局的逻辑删除规则(可以省略)
 * mybatis-plus:
 *   global-config:
 *     db-config:
 *       logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
 *       logic-delete-value: 1 # 逻辑已删除值(默认为 1)
 *       logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
 *   2)注册逻辑删除组件MP 3.1.1开始不需要此步骤--现在查看官网已经看不到这步要求(可以省略)
 *   3)实体类字段加上逻辑删除注解@TableLogic 且@TableLogic(value = "1",delval = "0")可以设置逻辑删除与不删除的值
 *   如果与默认全局配置冲突的话
 *
 * 3、使用aliyun对象存储OSS的步骤
 * 1）导入依赖
 *         <dependency>
 *             <groupId>com.alibaba.cloud</groupId>
 *             <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
 *             <version>2.2.0.RELEASE</version>
 *         </dependency>
 * 2）在yml文件中配置阿里云openAPI的endpoint access-key secret-key
 * 3）注入OSSClient 通过OSSClient.putObject传入bucket名 文件名含后缀以及本地文件流FileinputStream参数
 *    就可以将文件上传给阿里云的bucket列表
 *
 * 4、使用JSR303校验-高版本要手动导入依赖validation-api和springboot整合validation的启动类
 *         <dependency>
 *             <groupId>javax.validation</groupId>
 *             <artifactId>validation-api</artifactId>
 *             <version>2.0.1.Final</version>
 *         </dependency>
 *
 *         <dependency>
 *             <groupId>org.springframework.boot</groupId>
 *             <artifactId>spring-boot-starter-validation</artifactId>
 *             <version>2.6.3</version>
 *         </dependency>
 * 1)给Bean的字段前(如BrandEntity)添加校验规则的注解@NotBlank等(详见javax.validation.constraints),
 *   并添加自定义message信息，如@NotBlank(message = "品牌名必须提交")，不添加则使用默认提示信息
 *   此外如果有一些其它需求可以使用@Pattern并传入regexp值匹配自定义校验规则(正则)，如
 *  @Pattern(regexp = "/^[a-zA-Z]$/",message = "检索首字母必须是一个字母")
 * 	private String firstLetter;
 * 2)在Controller层的控制方法中需要校验Bean的方法参数前加校验注解@Valid开启校验，如public R save
 * (@Valid @RequestBody BrandEntity brand)
 * 3）如不想使用默认的校验结果，则可以在待校验Bean参数后紧跟一个BindingResult result，该变量封装的校验结果
 * 如public R save(@Valid @RequestBody BrandEntity brand, BindingResult result)
 * 4) 分组校验-根据应用场景的不同有不同的校验需求 如添加品牌和修改品牌对Bean的字段限定要求不同
 *  ①首先要创建不同的分组接口来做区分应用场景的依据。这里在common模块创建如下包体
 *  com.atguigu.common.validator.group并先创建AddGroup组和UpdateGroup组区分添加和修改场景
 *  ②给Bean实体类的字段上添加注解时赋予groups属性值，如groups={AddGroup.class,UpdateGroup.class}表示注解
 *  的校验规则生效场景
 *  ③使用@Validated({生效场景标记接口类.class})并传入分组接口字节码文件替代@Valid注解开启分组校验
 *  ④默认没有注明group分组的校验注解在分组校验情况下不生效
 */
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@MapperScan("com.atguigu.gulimall.product.dao")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
